#include <iostream>
#include <signal.h>
#include <unistd.h>
#include <sys/types.h>
#include <wait.h>

using namespace std;

void handler(int sig)
{
    cout << "捕捉到：" << sig << endl;
    int status = 0;
    pid_t pid = 0;
    while((pid = waitpid(-1, &status, WNOHANG)) > 0)
    {
        cout << "child pid" << pid << endl;
        cout << "!!!!!!!!!!!!" << endl;
        if(WIFEXITED(status))
            cout << "退出码为：" << WEXITSTATUS(status) << endl;
        else if(WIFSIGNALED(status))
            cout << "终止信号：" << WTERMSIG(status) << endl;
    }
}

// 3. 回收子进程通过信号
int main()
{
    struct sigaction act;
    act.sa_handler = handler;
    sigaction(SIGCHLD, &act, nullptr);
    // 4. 自定义SIG_IGN
    signal(SIGCHLD, SIG_IGN);
    if(fork() == 0)
    {
        cout << "child pid" << getpid() << endl;
        sleep(5);
        exit(0);
    }
    while(true) sleep(1);
    return 0;
}

// int flag = 1;

// void handler(int sig)
// {
//     cout << "捕捉：" << sig << endl;
//     flag = 0;
// }

// // 2. 函数优化实验
// int main()
// {
//     struct sigaction act;
//     act.sa_handler = handler;
//     sigaction(SIGINT, &act, nullptr);
//     while(flag)
//     {
//         sleep(1);
//     }
//     cout << "1 ->" << flag << endl;
//     return 0;
// }


// void handler(int signum)
// {
//     cout << "捕捉到信号：" << signum << endl;
//     int count = 5;
//     while(count--)
//     {
//         // 打印pending位图
//         sigset_t set;
//         sigpending(&set);
//         for(int i = 1; i <= 31; ++i)
//         {
//             if(sigismember(&set, i) == 1)
//                 cout << 1;
//             else
//                 cout << 0;
//         }
//         cout << endl;
//         sleep(1);
//     }
// }

// // 1. 实现一个信号执行中屏蔽
// int main()
// {
//     struct sigaction act,  oact;
//     act.sa_handler = handler;
//     sigfillset(&act.sa_mask);
//     sigaction(SIGINT, &act, &oact);
//     cout << "二号位是否存在：" << sigismember(&oact.sa_mask, 2) << endl;
//     while(true)
//     {
//         sleep(1);
//     }
//     return 0;
// }